package com.demo.sp;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.demo.common.model.*;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.upload.UploadFile;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.Date;
import java.util.List;
import java.util.Random;

public class SpController extends Controller {
    @Inject
    SpService spService;


    //上传图片路径
    public final static String PATH = "/upload";

    private final static int xhdpi = 660;
    private final static int mhdpi = 1280;

    /**
     * 用户列表
     */
    public void getUsers() {
        setAttr("users", spService.getUsers());
        renderJson();
    }

    /**
     * 审批项详情
     */
    public void findByid(Integer sid){

        Schedule schedule= spService.findByid(sid);
        renderJson(schedule);
    }
    /**
     * 保存审批顺序
     */

    public void saveSp() {
        JSONArray jsonArray = JSONObject.parseArray(get("arr"));
        String fid = get("Fid");
        for (int x = 0; x < jsonArray.size(); x++) {
            System.out.println(jsonArray.getJSONObject(x).get("index"));
            System.out.println(jsonArray.getJSONObject(x).get("value"));
            System.err.println("~~~~~~~~~~~~~~~~~~");
            FlowNode f = new FlowNode();
            f.setFlowid(fid);
            f.setNode(jsonArray.getJSONObject(x).getInteger("index"));
            f.setUid(jsonArray.getJSONObject(x).getString("value"));
            FUser fUser = new FUser().findFirst("select id,uname from f_user where id = ?", jsonArray.getJSONObject(x).getString("value"));
            f.setUname(fUser.getUname());
            f.save();

        }
        setAttr("data", "完成");
        renderJson();
    }
    /**
     * 审批流程列表回显
     */
    public void FindFlowNode(Integer fid){

        List<FlowNode> flowNodes = spService.FindFlowNode(fid);

        setAttr("flowNodes",flowNodes);
        renderJson();
    }


    /**
     * 审核通过
     */
    public void auditPass(Integer sid){
        Schedule schedule = new Schedule();
        schedule.setId(sid);
        schedule.setState("1");
        boolean update = schedule.update();
        if (update){
            setAttr("data","操作成功");
        }else {
            setAttr("data","操作失败");
        }

    }


    /**
     * 接收表单
     */
    public void saveForm() {
        Flow flow = new Flow();
        flow.setName(get("name"));
        flow.setHtml(get("html"));
        flow.setId(getInt());
        flow.save();
        setAttr("data", flow);
        renderJson(flow);
    }
    public void findFlow(Integer id){
        Flow byId = new Flow().findById(id);
        setAttr("byId",byId);
        renderJson(byId);
    }
    public void findAllflow(){
        List<Flow> all = new Flow().findAll();
        renderJson("flows",all);
    }

    /**
     * 查询所有表单
     */
    public void getAllForm() {
        setAttr("data", spService.getAllForm());
        renderJson();
    }

    /**
     * 查询单个表单
     */
    public void getForm() {
        setAttr("data", new Flow().dao().findById(get("id")));
        renderJson();
    }


    /**
     * 流程开始
     */
    public void start() {
        // 流程名
       /* get("fname");
        get("fid");
        get("html");
        get("uId");*/
        // 查询审批节点  从第一个开始
        String nodeUid = spService.getNodeUid(getInt("fid"), 1);
        if (nodeUid == null){
            setAttr("data", "流程" + nodeUid + "用户环节缺失");
            renderJson();
            return;
        }


        Flow fid = new Flow().findById(getInt("fid"));

        //  生成记录
        Schedule schedule = new Schedule();
        schedule.setId(getRandomString(5));
        schedule.setFId(getInt("fid"));
        
        schedule.setFName(fid.getName());
        schedule.setHtml(get("html"));
        // 发起人
        schedule.setUid(get("uid"));
        // 审批节点用户
        schedule.setNodeUid(nodeUid);
        schedule.save();
        if (!get("msg").equals("")){
            //儲存留言
            ScheduleMsg msg = new ScheduleMsg();
            msg.setId(getRandomString(5).toString());
            msg.setSid(schedule.getId().toString());
            msg.setMsg(get("msg"));
            msg.setUid(get("uid"));
            msg.setMsgtime(new Date());
            msg.save();
        }
        FlowNode next = spService.findNext(/*从第一次开始*/1 + 1, fid.getId());

        setAttr("data", "流程进入到" + next.getUname() + "用户环节");
        renderJson();
    }

    /**
     * 审批留言发起
     */
    public void flowSetMsg(Integer sid,String msg){

        Schedule schedule = new Schedule().findById(sid);
        ScheduleMsg scheduleMsg = new ScheduleMsg();
        scheduleMsg.setId(getRandomString(7).toString());
        scheduleMsg.setSid(schedule.getId().toString());
        if (schedule.getNodeUid()!=null){
            scheduleMsg.setUid(schedule.getNodeUid());
        }else {
            renderJson("用户id不存在");
        }
        scheduleMsg.setMsg(msg);
        scheduleMsg.setMsgtime(new Date());
        boolean save = scheduleMsg.save();
        if (save){
            setAttr("data","留言成功");
            renderJson();
        }else {
            renderJson("留言失败");
        }
    }

    /**
     * 流程前进  更新到下一节点
     */
    public void goNextNode(Integer userid,Integer flowid) {
        //根据用户id和审批项id查询出数据
        Schedule schedule = spService.findScheduleByUidAndFid(userid,flowid);
        //查出他的节点对象
        FlowNode flowNode = spService.findNodeByUidandFid(schedule.getNodeUid(), flowid);

        FlowNode first = spService.findNext(flowNode.getNode() + 1, flowid);

        if (first!=null){
            schedule
                    .setNodeUid(first.getUid());
            boolean update = schedule.update();
            if (update){
                renderJson("流程进入到" + first.getUname()+ "用户环节");
            }else {
                renderJson("操作失败");
            }
        }else {
            schedule.setState("1");
            setAttr("data","300");
            schedule.update();
            renderJson();
        }
    }

    /**
     * 流程后退 [选择]  上一节点
     * id
     */
    public void back(int sid,int flowid,int node) {
        /*//查出原来的
        String nodeUid = spService.getBy(id);*/
        //节点-1 去取下一个节点的用户id
        String NextNodeUid = spService.getNodeUid(flowid,node);
        //对记录表进行更新 更新到下一节点
        spService.goNextNode(sid,NextNodeUid);
        setAttr("data", "流程回退到" + NextNodeUid + "用户环节");
        renderJson();
    }


    /**
     * 我发起的审批
     */
    public void findMyflow() {

        List<Schedule> scheduleList = spService.findMyflow(get("uid"));
        setAttr("scheduleList",scheduleList);
        renderJson();

    }


    /**
     * 需要我审批0
     */
    public void isMyflow(){

        List<Schedule> schedules = spService.isMyflow(get("nodeUid"));
        setAttr("schedules",schedules);
        renderJson();
    }


    /**
     * 用户节点选择列表
     */
    public void findFlowNode(Integer sid,Integer uid){

        /*spService.findFlowNode(sid,uid);*/
        /*List<FlowNode> flowNodes = spService.findFlowNode(sid,uid);*/
        FlowNode flowNode = spService.findFlowNodeBySidAndUid(sid,uid);
        List<FlowNode> FlowNodes =  spService.findBeforeFlowNode(flowNode);
        FlowNode flowNode1 = FlowNodes.get(0);
        flowNode1.put("first",1);
        renderJson(FlowNodes);
    }
    /**
     * 需求:::::
     *
     *      其他 :  已发起审批留言  环节内的人都可以留言 都可以查看   沟通
     *      限制 :  只有表单发起人可以表单内容  前提是 当前 流程环节在发起人  已流到其他人环节不可修改
     *      完成:  流程已完结
     *      状态:  我的发起流程目前在哪个节点
     *
     *
     */


    /**
     * 留言修改
     */
    public void msgUpDate(String id,String msg){

        //必须抱枕节点在当前人这里 才能进行修改
        ScheduleMsg scheduleMsg = new ScheduleMsg().findById(id);
        Schedule schedule = spService.findScheduleBySid(scheduleMsg.getSid());
        if (scheduleMsg.getUid().equals(schedule.getNodeUid())){
            scheduleMsg.setMsg(msg);
            scheduleMsg.update();
            renderJson("修改成功");
        }else {
            renderJson("修改失败:您的消息已经进入下一步审批，不能进行修改");
        }

    }

    /**
     * 留言查看
     * id 审批流程id
     */
    public void findMsg(){
        List<ScheduleMsg> list = spService.findMsg(getInt("id"));
        setAttr("msgList",list);
        renderJson();
    }

    /**
     * 留言删除
     */
    public void delMsg(Integer id){

        boolean b = new ScheduleMsg().deleteById(id);
        if (b){
            renderJson("删除成功");
        }else {
            renderJson("删除失败");
        }
    }
    /**
     * 生成随机字符串
     * @param length  字符串长度
     * @return
     */
    public static Integer getRandomString(int length) { //length表示生成字符串的长度
        String base = "0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return Integer.parseInt(sb.toString());
    }

    /**
     * 文件上传
     * @throws Exception
     */
    public void upFile() throws Exception {
        UploadFile file = getFile("file");
        String upload = upload(getRequest(), file.getFile(), file.getFileName());
        setAttr("FileName",upload);
        System.out.println(upload);
        renderJson(upload);
    }


    /**
     * 上传文件，以文件的形式，不会对图片进行压缩
     * @file file要上传的文件
     * @fileFileName filename文件名
     * @return 上传成功后的文件名
     */
    public static String upload(HttpServletRequest request, File file, String fileFileName) throws Exception {
        String dir = request.getSession().getServletContext().getRealPath("/");
        File fileLocation = new File(dir);
        if(!fileLocation.exists()) {
            boolean isCreated  = fileLocation.mkdir();
            if(!isCreated) {
                //目标上传目录创建失败,可做其他处理,例如抛出自定义异常等,一般应该不会出现这种情况。
                return null;
            }
        }
        //      fileFileName = UUID.randomUUID().toString()+System.currentTimeMillis()+fileFileName;
        fileFileName = fileFileName;
        InputStream is = new FileInputStream(file);
        /*OutputStream os = new FileOutputStream(dir+"/"+fileFileName);
        // 因为file是存放在临时文件夹的文件，我们可以将其文件名和文件路径打印出来，看和之前的fileFileName是否相同
        byte[] buffer = new byte[500];
        int length = 0;
        while(-1 != (length = is.read(buffer, 0, buffer.length)))
        {
            os.write(buffer);
        }
        os.close();*/
        is.close();
        return fileFileName;
    }
}
